package com.jfinal.config;

import com.jfinal.server.undertow.UndertowServer;
import com.jfinal.template.Engine;
import com.jfinal.template.stat.Compressor;

/**
 * 主配置文件
 *
 * @author QQ：372846226
 * @date 2023年3月19日
 */
public class AppConfig extends JFinalConfig {
    /**
     * 启动入口，运行此 main 方法可以启动项目，此 main 方法可以放置在任意的 Class 类定义中，不一定要放于此
     */
    public static void main(String[] args) {
        UndertowServer.start(AppConfig.class, 8080, true);
    }

    /**
     * 配置常量
     */
    public void configConstant(Constants me) {

        me.setDevMode(true);

        /**
         * 支持 Controller、Interceptor、Validator 之中使用 @Inject 注入业务层，并且自动实现 AOP
         * 注入动作支持任意深度并自动处理循环注入
         */
        me.setInjectDependency(true);

        // 配置对超类中的属性进行注入
        me.setInjectSuperClass(true);

        // 配置文件上传路径
        me.setBaseUploadPath("upload");
    }

    /**
     * 配置路由
     */
    public void configRoute(Routes me) {
        me.add(new Routes() {
            @Override
            public void config() {
                // 配置视图基础路径，避免 render(...) 参数输入前缀 "/_view/admin"
                this.setBaseViewPath("/_view");
                // 扫描后台路由
                this.scan("com.jfinal.");
            }
        });
    }

    public void configEngine(Engine me) {
        // 要放在共享的模板文件之前
        me.setCompressor(new HrefCompressor());

        // devMode 为 true 时支持模板文件热加载
        me.setDevMode(true);
        // 开启压缩功能
        // me.setCompressorOn();
    }

    /**
     * 配置插件
     */
    public void configPlugin(Plugins me) {
    }

    /**
     * 配置全局拦截器
     */
    public void configInterceptor(Interceptors me) {
    }

    /**
     * 配置处理器
     */
    public void configHandler(Handlers me) {
    }

    // 服务启动时回调 onStart()
    public void onStart() {
    }

    // 服务关闭时回调 onStop()
    public void onStop() {
    }


    /**
     * 处理静态文件缓存问题
     */
    public static class HrefCompressor extends Compressor {

        public HrefCompressor() {
        }

        public HrefCompressor(char separator) {
            super(separator);
        }

        @Override
        public StringBuilder compress(StringBuilder content) {
            long ms = System.currentTimeMillis();
            String regex = ".+(?:\\.(js|css|png|jpg)(?=\"))";

            content = new StringBuilder(
                    content.toString().replaceAll(regex, "$0?s=" + ms)
                    // content.toString().replace(".js\"", ".js?date=" + ms + "\"").replace(".css\"", ".css?date=" + ms + "\"");
            );

            return super.compress(content);
        }
    }
}
